import math
import random

#以第一点p1为原点,判断p2点在第几象限,返回1234象限56xy轴(jpf2024.8.31)
def math_quadrant(p1,p2):
    # 提取元组xy值
    x1,y1=p1
    x2,y2=p2
    # 判断象限1234象限5=x轴上,6=y轴上
    if x2>x1 and y2<y1:
        return 1
    elif x2<x1 and y2<y1:
        return 2
    elif x2<x1 and y2>y1:
        return 3
    elif x2>x1 and y2>y1:
        return 4
    elif x1==x2:
        return 6
    elif y1==y2:
        return 5
    
# 获取窗口左上角坐标和窗口宽高(x,y,w,h)(jpf2024.8.31)
def math_x_y_width_height(p1,p2):
    # 提取元组xy值
    x1,y1=p1
    x2,y2=p2
    #取最小值,获得窗口左上角坐标
    x0=min(x1,x2)
    y0=min(y1,y2)
    #取绝对值获得窗口宽高
    w=abs(x1-x2)
    h=abs(y1-y2)
    return (x0,y0,w,h)

# 定义一个RGB或者BGR互转处理顺序调换方法 #默认返回列表
def rgb2bgr(rgb, tupleOut=False):
    if tupleOut == True:
        return (rgb[2], rgb[1], rgb[0])
    else:
        return [rgb[2], rgb[1], rgb[0]]
# 定义一个(x,y)(y,x)互转处理顺序调换方法 #默认返回列表
def xy2yxL(xy ,tupleOut=False):
    if tupleOut == True:
        return (xy[1], xy[0])
    else:
        return [xy[1], xy[0]]
# 方法不可以重载,需要在类总重载函数参数
def xy2yx(x,y, tupleOut=False):
    if tupleOut == True:
        return (y,x)
    else:
        return [y,x]

# 定义一个加数列表(正负值,列表) #默认返回列表 例如((10,20,30),5)->[15,25,35]
def sum2In(numlist, num, tupleOut=False):
    if tupleOut == True:
        return tuple([i + num for i in numlist])
    else:
        return [i + num for i in numlist]

# 两个元组中的对应元素进行相加 例如((10,20),(-6,5))->(4,25)
def sum2ab(a,b,tupleOut=False):
    if tupleOut == True:
        return tuple(map(lambda x, y: x + y, a, b))
    else:
        return list(map(lambda x, y: x + y, a, b))
    
    

# 角度转坐标位置(角度,半径半径比值像素,偏移点,是否转成元素)
def math_angle2xy(angle,r=1,pxy=(0,0),tupleOut=True):
    x,y=pxy[:2]
    # 角度转弧度弧度值
    rad=math.radians(angle)
    # sincos弧度下的xy比值
    sina=math.sin(rad) 
    cosa=math.cos(rad)
    # 计算圆上的点位置=半径r的比值+偏移圆心
    px=int(cosa*r)+x
    py=int(sina*r)+y
    if tupleOut==True:
            return (px,py)
    else:
        return [px,py]
    
# 一般圆公式x^2+y^2=r^2,求y
def math_circle_px2_y(x,p, r,tint=True):
    h, k=p
    # 计算圆的方程的右侧
    right_side = r**2 - (x - h)**2
    # 检查右侧是否为非负数，以确保有实数解
    if right_side < 0:
        print("Err:math_circle_px2_y()参数中没有找到点y")
        return None
    # 计算 y 的两个可能值
    y1 = k + math.sqrt(right_side)
    y2 = k - math.sqrt(right_side)
    if tint:
        return int(y1),int(y2)
    else:
        return y1, y2

# 一般圆公式x^2+y^2=r^2,求x
def math_circle_py2_x(y, p, r,tint=True):
    # 原点坐标p,半径r,求y上的x(左右2个点)
    h, k=p
    # 计算圆的方程的右侧
    right_side = r**2 - (y - k)**2
    # 检查右侧是否为非负数，以确保有实数解
    if right_side < 0:
        print("Err:math_circle_py2_x()参数中没有找到点x")
        return None
    # 计算 x 的两个可能值
    x1 = h + math.sqrt(right_side)
    x2 = h - math.sqrt(right_side)
    if tint:
        return int(x1),int(x2)
    else:
        return x1, x2